package modelo.test;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import modelo.enemigos.Arana;
import modelo.enemigos.Cucaracha;
import modelo.enemigos.Enemigo;
import modelo.enemigos.ExceptionPasoUltimoCasillero;
import modelo.enemigos.Hormiga;
import modelo.enemigos.Mosca;
import modelo.juego.Configuracion;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;

public class PruebaEnemigo extends TestCase {

	private Enemigo e;

	public void testGetCasillero() {
		Casillero c = new Casillero(2, 4);

		e = new Arana(c);
		assertEquals(c, e.getCasillero());
	}

	public void testSetCasillero() {
		Casillero c = new Casillero(2, 4);
		Casillero nuevoCasillero = new Casillero(6, 12);
		e = new Arana(c);
		e.setCasillero(nuevoCasillero);

		assertEquals(nuevoCasillero, e.getCasillero());
	}

	public void testDaniar() {
		Casillero c = new Casillero(2, 4);
		e = new Mosca(c);
		e.Daniar(2);

		assertEquals((Configuracion.RESISTENCIA_MOSCA - 2), e.getResistencia());
	}

	public void testGetResistencia() {
		Casillero c = new Casillero(2, 4);
		e = new Mosca(c);

		assertEquals(Configuracion.RESISTENCIA_MOSCA, e.getResistencia());
	}

	public void testCambiarVelocidad() {
		Casillero c = new Casillero(2, 4);
		e = new Arana(c);

		e.CambiarVelocidad(2);

		assertEquals((Configuracion.VELOCIDAD_ARANIA * 2), e.getVelocidad());
	}

	public void testCongelar() {
		Casillero c = new Casillero(2, 4);
		e = new Arana(c);
		assertTrue(!e.getCongelado());

		e.Congelar(true);
		assertTrue(e.getCongelado());
	}

	public void testGetCongelado() {
		Casillero c = new Casillero(2, 4);
		e = new Arana(c);
		assertFalse(e.getCongelado());
	}

	public void testAvanzar() {
		Mapa m = new Mapa(20);
		m.setCamino();
		Casillero c = m.primeraPosicion();
		Casillero segundo = m.proximaPosicionDeCamino(c);
		Casillero tercero = m.proximaPosicionDeCamino(segundo);
		e = new Arana(c);
		m.posicionarPosicionable(c, e);

		// Verifico q haya llegado al segundo casillero
		try {
			e.avanzar(m);
			assertSame(c, e.getCasillero());
			e.avanzar(m);
			assertSame(c, e.getCasillero());
			e.avanzar(m);
			assertSame(c, e.getCasillero());
			e.avanzar(m); // Acá si avanza porque ya le da la velocidad
		} catch (ExceptionPasoUltimoCasillero cruzo) {
			assertTrue(false);
		}
		assertNotSame(c, e.getCasillero());
		assertSame(segundo, e.getCasillero());

		// Verifico q haya llegado al tercer casillero
		try {
			e.avanzar(m);
			assertSame(segundo, e.getCasillero());
			e.avanzar(m);
			assertSame(segundo, e.getCasillero());
			e.avanzar(m); // Acá si avanza porque ya le da la velocidad
		} catch (ExceptionPasoUltimoCasillero cruzo) {
			assertTrue(false);
		}
		assertNotSame(c, e.getCasillero());
		assertNotSame(segundo, e.getCasillero());
		assertSame(tercero, e.getCasillero());

		// Verifico q el enemigo se quede quieto si esta congelado
		e.Congelar(true);
		try {
			for (int i = 0; i < 99; i++) {
				e.avanzar(m);
			}
		} catch (ExceptionPasoUltimoCasillero cruzo) {
			assertTrue(false);
		}
		assertSame(tercero, e.getCasillero());

		/*
		 * Esto me parece que esta de más assertNotSame(c.getPosicion().getX(),
		 * e.getCasillero().getPosicion().getX() );
		 * assertNotSame(c.getPosicion().getY(),
		 * e.getCasillero().getPosicion().getY() );
		 */
	}

	public void testGetVolar() {
		Casillero c = new Casillero(2, 4);
		e = new Arana(c);
		assertFalse(e.getVolar());

		e = new Mosca(c);
		assertTrue(e.getVolar());
	}

	public void testDineroPorEliminacion() {
		Casillero c = new Casillero(2, 4);
		e = new Arana(c);
		assertEquals(Configuracion.DINERO_ARANA, e.dineroPorEliminacion());

		e = new Mosca(c);
		assertEquals(Configuracion.DINERO_MOSCA, e.dineroPorEliminacion());

		e = new Cucaracha(c);
		assertEquals(Configuracion.DINERO_CUCARACHA, e.dineroPorEliminacion());

		e = new Hormiga(c);
		assertEquals(Configuracion.DINERO_HORMIGA, e.dineroPorEliminacion());
	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTestSuite(PruebaEnemigo.class);
		return suite;
	}
}